package com.hsurosy.hsuchain.nft.order.infrastructure.id;

import org.redisson.api.RAtomicLong;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/**
 * WorkerId 管理类
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-05 17:53
 * @Description
 * @Version: v1.0.0
 */
@Component
public class WorkerIdHolder implements CommandLineRunner {

    /**
     * Redis 客户端
     * 用于从 Redis 获取或更新 WorkerId
     */
    @Autowired
    private RedissonClient redissonClient;

    /**
     * 全局静态变量，用于保存当前实例的 WorkerId
     */
    public static long WORKER_ID;

    /**
     * 运行时初始化 WorkerId
     * <p>
     * 在 Spring Boot 启动时执行，获取 Redis 中的计数器值，并将其作为 WorkerId。
     * 通过 Redis 的分布式原子递增功能保证 WorkerId 的唯一性。
     * </p>
     *
     * @param args 启动参数
     * @throws Exception 如果发生异常
     */
    @Override
    public void run(String... args) throws Exception {
        // 获取 Redis 中的计数器（如果不存在则创建）
        RAtomicLong atomicLong = redissonClient.getAtomicLong("workerId");

        // 自增并取模，确保 WorkerId 在 0 到 31 之间循环
        WORKER_ID = atomicLong.incrementAndGet() % 32;
    }
}
